﻿/*  Eleven Business Suite : Un ERP básico para pequeños empresarios.
 *  Copyright (C) 2011  Francis Bolaños Arias
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>;.
 */

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ElevenCore;
using ElevenGlobal;

namespace ElevenGUI
{
    public partial class FrmProveedores : Form
    {
        private DataTable dtProvPaises;
        private DataTable dtProvProvincias;
        private DataTable dtProvCantones;
        private DataTable dtProvDistritos;

        private GLOBuscador buscador;

        public FrmProveedores()
        {
            InitializeComponent();
        }

        private void FrmProveedores_Load(object sender, EventArgs e)
        {
            cargarComboBox();
        }

        #region Métodos Carga de Datos

        private void cargarComboBox()
        {
            try
            {
                cargarComboBoxPais();
                cargarComboBoxProvincia();
                cargarComboBoxCanton();
                cargarComboBoxDistritos();
            }
            catch (Exception) { }
        }

        private void cargarComboBoxPais()
        {
            dtProvPaises = GENPais.consultar();
            cbProvPais.DataSource = dtProvPaises;
            cbProvPais.DisplayMember = "Nombre";
            cbProvPais.ValueMember = "IdPais";
        }

        private void cargarComboBoxProvincia()
        {
            try
            {
                cbProvProvincia.DataSource = new DataTable();
                cbProvCanton.DataSource = new DataTable();
                cbProvDistrito.DataSource = new DataTable();
                dtProvProvincias = GENProvincia.consultar(int.Parse(cbProvPais.SelectedValue.ToString()));
                cbProvProvincia.DataSource = dtProvProvincias;
                cbProvProvincia.DisplayMember = "Nombre";
                cbProvProvincia.ValueMember = "IdProvincia";
            }
            catch (FormatException) { }
        }

        private void cargarComboBoxCanton()
        {
            try
            {
                cbProvCanton.DataSource = new DataTable();
                dtProvCantones = GENCanton.consultar(int.Parse(cbProvProvincia.SelectedValue.ToString()));
                cbProvCanton.DataSource = dtProvCantones;
                cbProvCanton.DisplayMember = "Nombre";
                cbProvCanton.ValueMember = "IdCanton";
            }
            catch (FormatException) { }
        }

        private void cargarComboBoxDistritos()
        {
            try
            {
                cbProvDistrito.DataSource = new DataTable();
                dtProvDistritos = GENDistrito.consultar(int.Parse(cbProvCanton.SelectedValue.ToString()));
                cbProvDistrito.DataSource = dtProvDistritos;
                cbProvDistrito.DisplayMember = "Nombre";
                cbProvDistrito.ValueMember = "IdDistrito";
            }
            catch (FormatException) { }
        }

        #endregion

        #region Eventos ComboBox

        private void cbProvPais_SelectedIndexChanged(object sender, EventArgs e)
        {
            cargarComboBoxProvincia();
        }

        private void cbProvCanton_SelectedIndexChanged(object sender, EventArgs e)
        {
            cargarComboBoxDistritos();
        }

        private void cbProvProvincia_SelectedIndexChanged(object sender, EventArgs e)
        {
            cargarComboBoxCanton();
        }

        #endregion

        #region Eventos Botones

        private void btnNuevoProv_Click(object sender, EventArgs e)
        {
            txtCorreo.Enabled = true;
            txtSitioWeb.Enabled = true;
            txtCedJur.Enabled = true;
            txtNombre.Enabled = true;
            txtNombreJur.Enabled = true;
            txtDireccion.Enabled = true;
            txtTel1.Enabled = true;
            txtTel2.Enabled = true;
            txtFax.Enabled = true;
            txtCorreo.Text = "";
            txtSitioWeb.Text = "";
            txtCedJur.Text = "";
            txtNombre.Text = "";
            txtNombreJur.Text = "";
            txtDireccion.Text = "";
            txtTel1.Text = "";
            txtTel2.Text = "";
            txtFax.Text = "";
            txtID.Text = "";
            txtRegion.Text = "";
            cargarComboBox();
            btnNuevoProv.Enabled = false;
            btnEliminarProv.Enabled = false;
            btnCancelarProv.Enabled = true;
            btnBuscar.Enabled = false;
            txtCedJur.Focus();
        }

        private void btnCancelarProv_Click(object sender, EventArgs e)
        {
            txtCorreo.Enabled = false;
            txtSitioWeb.Enabled = false;
            txtCedJur.Enabled = false;
            txtNombre.Enabled = false;
            txtNombreJur.Enabled = false;
            txtDireccion.Enabled = false;
            txtTel1.Enabled = false;
            txtTel2.Enabled = false;
            txtFax.Enabled = false;
            txtCorreo.Text = "";
            txtSitioWeb.Text = "";
            txtCedJur.Text = "";
            txtNombre.Text = "";
            txtNombreJur.Text = "";
            txtDireccion.Text = "";
            txtTel1.Text = "";
            txtTel2.Text = "";
            txtFax.Text = "";
            txtRegion.Text = "";
            txtID.Text = "";
            btnNuevoProv.Enabled = true;
            btnEliminarProv.Enabled = true;
            btnCancelarProv.Enabled = false;
            btnBuscar.Enabled = true;
        }

        private void btnGuardarProv_Click(object sender, EventArgs e)
        {
            if (!btnCancelarProv.Enabled)
            {
                try
                {
                    //DataRowView dr = (DataRowView)(lstProveedores.SelectedItem);
                    DataRowView dr2 = (DataRowView)(cbProvDistrito.SelectedItem);
                    int distrito;
                    if (!cbxEditarRegion.Checked)
                    {
                        distrito = -1;
                    }
                    else {
                        distrito = int.Parse(dr2["IdDistrito"].ToString());
                    }
                    SCMProveedor prov = new SCMProveedor(int.Parse(txtID.Text), txtCedJur.Text, txtNombre.Text
                        , txtNombreJur.Text, txtDireccion.Text, distrito, txtTel1.Text, txtTel2.Text
                        , txtFax.Text, txtCorreo.Text, txtSitioWeb.Text);
                    prov.modificar();
                    GLOMensajeAceptar mensaje = new GLOMensajeAceptar("Proveedor actualizado con éxito");
                    mensaje.ShowDialog();
                }
                catch (NullReferenceException ne)
                {
                    GLOMensajeError error = new GLOMensajeError("Error de validación", "Para actualizar un proveedor debe elegir uno de la lista de proveedores a la izquierda.\n Si desea crear uno nuevo de click en el botón \"Nuevo\". " +
                        "\n\n Si eligió uno debe elegir un distrito.\n\n Mensaje técnico del error: " + ne.Message, "NullReferenceException");
                    error.ShowDialog();
                }
                catch (ValidadorException ve)
                {
                    GLOMensajeError error = new GLOMensajeError("Error al validar los datos.", "Por favor revise los datos, ya que alguno está en algún formato incorrecto\n\n Mensaje técnico del error: " + ve.Message, "ValidadorException");
                    error.ShowDialog();
                }
                catch (SqlException se)
                {
                    GLOMensajeError error = new GLOMensajeError("Error grave al conectar con la base de datos.", "Este error puede deberse a que se haya perdido la conexión con la base de datos o ocurriera un error en el sistema.\n\n Mensaje técnico del error: " + se.Message, "SqlException");
                    error.ShowDialog();
                }
            }
            else
            {
                try
                {
                    DataRowView dr = (DataRowView)(cbProvDistrito.SelectedItem);
                    SCMProveedor prov = new SCMProveedor(0, txtCedJur.Text, txtNombre.Text
                        , txtNombreJur.Text, txtDireccion.Text, int.Parse(dr["IdDistrito"].ToString()), txtTel1.Text, txtTel2.Text
                        , txtFax.Text, txtCorreo.Text, txtSitioWeb.Text);
                    prov.insertar();
                    GLOMensajeAceptar mensaje = new GLOMensajeAceptar("Proveedor insertado con éxito");
                    mensaje.ShowDialog();
                    btnCancelarProv.PerformClick();
                }
                catch (ValidadorException ve)
                {
                    GLOMensajeError error = new GLOMensajeError("Error al validar los datos.", "Por favor revise los datos, ya que alguno está en algún formato incorrecto\n\n Mensaje técnico del error: " + ve.Message, "ValidadorException");
                    error.ShowDialog();
                }
                catch (NullReferenceException ne)
                {
                    GLOMensajeError error = new GLOMensajeError("Error de validación", "Debe escoger país, provincia, cantón y distrito donde se encuentra el proveedor.\n\n Mensaje técnico del error: " + ne.Message, "NullReferenceException");
                    error.ShowDialog();
                }
                catch (SqlException se)
                {
                    GLOMensajeError error = new GLOMensajeError("Error grave al conectar con la base de datos.", "Este error puede deberse a que se haya perdido la conexión con la base de datos o ocurriera un error en el sistema.\n\n Mensaje técnico del error: " + se.Message, "SqlException");
                    error.ShowDialog();
                }
            }
        }

        private void btnEliminarProv_Click(object sender, EventArgs e)
        {
            try
            {
                SCMProveedor prov = new SCMProveedor(int.Parse(txtID.Text), "", "N", "", "", 0, "", "", "", "", "");
                if (prov.eliminar())
                {
                    txtCorreo.Enabled = false;
                    txtSitioWeb.Enabled = false;
                    txtCedJur.Enabled = false;
                    txtNombre.Enabled = false;
                    txtNombreJur.Enabled = false;
                    txtDireccion.Enabled = false;
                    txtTel1.Enabled = false;
                    txtTel2.Enabled = false;
                    txtFax.Enabled = false;
                    txtCorreo.Text = "";
                    txtSitioWeb.Text = "";
                    txtCedJur.Text = "";
                    txtNombre.Text = "";
                    txtNombreJur.Text = "";
                    txtDireccion.Text = "";
                    txtTel1.Text = "";
                    txtTel2.Text = "";
                    txtFax.Text = "";
                    GLOMensajeAceptar mensaje = new GLOMensajeAceptar("Se ha eliminado el proveedor");
                    mensaje.ShowDialog();
                }
                else {
                    GLOMensajeError error = new GLOMensajeError("Error grave al conectar con la base de datos.", "Este error puede deberse a que se haya perdido la conexión con la base de datos o ocurriera un error en el sistema.\n\n Mensaje técnico del error: " + Cache.ErrorActual, "SqlException");
                    error.ShowDialog();
                }
            }
            catch (NullReferenceException ne)
            {
                GLOMensajeError error = new GLOMensajeError("Error de validación", "Debe elegir un proveedor de la lista a la izquierda para eliminarlo.\n\n Mensaje técnico del error: " + ne.Message, "NullReferenceException");
                error.ShowDialog();
            }
            catch (SqlException se)
            {
                GLOMensajeError error = new GLOMensajeError("Error grave al conectar con la base de datos.", "Este error puede deberse a que se haya perdido la conexión con la base de datos o ocurriera un error en el sistema.\n\n Mensaje técnico del error: " + se.Message, "SqlException");
                error.ShowDialog();
            }
        }

        #endregion

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            buscador = new GLOBuscador();
            buscador.Entidad = (int)GLOBuscador.Entidades.Proveedor;
            buscador.FormClosed += new FormClosedEventHandler(buscador_Closed);
            buscador.ShowDialog();
        }

        private void buscador_Closed(object sender, FormClosedEventArgs e)
        {
            try
            {
                txtID.Text = Cache.proveedor.Cells[0].Value.ToString();
                txtCedJur.Text = Cache.proveedor.Cells[1].Value.ToString();
                txtNombre.Text = Cache.proveedor.Cells[2].Value.ToString();
                txtNombreJur.Text = Cache.proveedor.Cells[3].Value.ToString();
                txtDireccion.Text = Cache.proveedor.Cells[4].Value.ToString();
                txtRegion.Text = Cache.proveedor.Cells[5].Value.ToString();
                txtTel1.Text = Cache.proveedor.Cells[6].Value.ToString();
                txtTel2.Text = Cache.proveedor.Cells[7].Value.ToString();
                txtFax.Text = Cache.proveedor.Cells[8].Value.ToString();
                txtCorreo.Text = Cache.proveedor.Cells[9].Value.ToString();
                txtSitioWeb.Text = Cache.proveedor.Cells[10].Value.ToString();
                txtCorreo.Enabled = true;
                txtSitioWeb.Enabled = true;
                txtCedJur.Enabled = true;
                txtNombre.Enabled = true;
                txtNombreJur.Enabled = true;
                txtDireccion.Enabled = true;
                txtTel1.Enabled = true;
                txtTel2.Enabled = true;
                txtFax.Enabled = true;
                btnEliminarProv.Enabled = true;
                btnCancelarProv.Enabled = false;
                btnBuscar.Enabled = true;
            }
            catch (NullReferenceException) { }
        }

    }
}
